package top.serms.leetcode;

import java.util.*;

class LeetCode15Solution {
    private static List<List<Integer>> res;

    /**
     * 寻找数组中所有不重复的三元组，使得三元组的和为 0。
     *
     * @param nums 给定的整数数组
     * @return 由符合条件的三元组组成的列表
     */
    public static List<List<Integer>> threeSum(int[] nums) {
        return new AbstractList<List<Integer>>() {
            public List<Integer> get(int index) {
                init();
                return res.get(index);
            }

            public int size() {
                init();
                return res.size();
            }

            /**
             * 初始化操作，找到数组中所有满足条件的三元组
             */
            private void init() {
                if (res != null) return;

                Arrays.sort(nums);
                int l, r, sum;
                Set<List<Integer>> tempRes = new HashSet<>();

                // 遍历数组，找到所有不重复的三元组使得和为 0
                for (int i = 0; i < nums.length - 2; ++i) {
                    l = i + 1;
                    r = nums.length - 1;
                    while (l < r) {
                        sum = nums[i] + nums[l] + nums[r];
                        if (sum == 0)
                            tempRes.add(Arrays.asList(nums[i], nums[l], nums[r]));
                        if (sum < 0) ++l;
                        else --r;
                    }
                }
                res = new ArrayList<>(tempRes);
            }
        };
    }

    public static List<List<Integer>> threeSum2(int[] nums) {
        return new AbstractList<List<Integer>>() {
            public List<Integer> get(int index) {
                init();
                System.out.println("Get执行了");
                return res.get(index);
            }


            public int size() {
                init();
                System.out.println("Size执行了");
                return res.size();
            }

            /**
             * 初始化操作，找到数组中所有满足条件的三元组
             */
            private void init() {
                System.out.println("init");
                if (res != null) return;

                Arrays.sort(nums);
                int l, r, sum;
                Set<List<Integer>> tempRes = new HashSet<>();

                // 遍历数组，找到所有不重复的三元组使得和为 0
                for (int i = 0; i < nums.length - 2; ++i) {
                    l = i + 1;
                    r = nums.length - 1;
                    while (l < r) {
                        sum = nums[i] + nums[l] + nums[r];
                        if (sum == 0)
                            tempRes.add(Arrays.asList(nums[i], nums[l], nums[r]));
                        if (sum < 0) ++l;
                        else --r;
                    }
                }
                res = new ArrayList<>(tempRes);
                System.out.println("我初始化了");
            }
        };
    }

    public static void main(String[] args) {
        List<List<Integer>> lists = threeSum2(new int[]{-1, 0, 1, 2, -1, -4});
        System.out.println(lists.toString());
    }
}